package com.dlyk.web;

import com.dlyk.model.User;
import com.dlyk.query.UserQuery;
import com.dlyk.result.R;
import com.dlyk.service.UserService;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户
 */
@RestController
public class UserController {

    @Resource
    private UserService userService;

    /**
     * 获取登录用户信息
     */
    @GetMapping("/api/login/info")
    public R loginInfo(Authentication authentication) {

        User user = (User) authentication.getPrincipal();

        return R.OK(user);
    }

    /**
     * 校验token，判断用户是否免登录
     */
    @GetMapping("/api/login/free")
    public R loginFree(HttpServletRequest request) {

        // 过滤器链中添加了校验token的过滤器，如果token校验未通过会返回相对应的结果

        // 除了登录请求以外的任何请求，都会被验证token过滤器拦截

        // 程序能执行到这里，说明token是合法的

        // 所以这里直接返回R对象（结果码200）就行，即token校验通过
        return R.OK();
    }

    /**
     * 查询用户列表（PageHelper分页查询）
     */
    // 要想使用@PreAuthorize注解，需要在Spring Security配置类中使用@EnableMethodSecurity注解，开启方法级别的权限检查
    // 当前用户有 "user:list" 这个权限标识符时才可以访问这个控制器
    @PreAuthorize(value = "hasAuthority('user:list')")
    @GetMapping("/api/user/list")
    public R userListPage(@RequestParam(value = "current", required = false) Integer current) {

        // required = false  表示非必须，这个参数也可以不传，不传参数，默认查询第一页
        if (current == null) {
            current = 1;
        }

        // 调用service查询
        PageInfo<User> userPageInfo = userService.getUserListByPage(current);

        return R.OK(userPageInfo);
    }

    /**
     * 通过id查询用户详情
     */
    @PreAuthorize(value = "hasAuthority('user:detail')")
    @GetMapping("/api/user/detail/{id}")
    public R userDetail(@PathVariable(value = "id") Integer id) {

        User user = userService.getUserDetailById(id);
        return R.OK(user);
    }

    /**
     * 添加用户
     */
    @PreAuthorize(value = "hasAuthority('user:add')")
    @PostMapping("/api/user/add")
    public R addUser(UserQuery userQuery, Authentication authentication) {

        int save = userService.saveUser(userQuery, authentication);

        return save >= 1 ? R.OK() : R.FAIL();
    }

    /**
     * 编辑用户
     */
    @PreAuthorize(value = "hasAuthority('user:edit')")
    @PutMapping("/api/user/edit")
    public R editUser(UserQuery userQuery, Authentication authentication) {

        int edit = userService.editUser(userQuery, authentication);

        return edit >= 1 ? R.OK() : R.FAIL();
    }

    /**
     * 删除用户
     */
    @PreAuthorize(value = "hasAuthority('user:remove')")
    @DeleteMapping("/api/user/remove/{id}")
    public R removeUserById(@PathVariable("id") Integer id) {

        int remove = userService.removeUserById(id);

        return remove >= 1 ? R.OK() : R.FAIL();
    }

    /**
     * 批量删除用户
     */
    @PreAuthorize(value = "hasAuthority('user:remove')")
    @DeleteMapping("/api/user/batchRemove")
    // 这里前端传递的参数是String类型，后端SpringMVC会自动进行类型转换（需要使用@RequestParam注解）
    public R batchRemove(@RequestParam("ids") List<String> ids) {

        int batchRemove = userService.batchRemoveUserByIds(ids);

        return batchRemove >= ids.size() ? R.OK() : R.FAIL();
    }

    /**
     * 查询负责人
     */
    @GetMapping("/api/owner/list")
    public R ownerList() {

        List<User> ownerList = userService.getOwnerList();

        return R.OK(ownerList);
    }

    /**
     * 验证旧密码是否正确（用于修改密码前的验证）
     */
    @PostMapping("/api/user/checkOldPwd")
    public R checkOldPwd(String oldPwd) {

        boolean matchesResult = userService.checkOldPwd(oldPwd);

        return matchesResult ? R.OK() : R.FAIL();
    }

    /**
     * 修改密码
     */
    @PutMapping("/api/user/changePwd")
    public R changePwd(String newPwd) {

        // 直接修改密码即可，旧密码的合法性已经验证过了
        int edit = userService.editUserLoginPwd(newPwd);

        return edit >= 1 ? R.OK() : R.FAIL();
    }

    /**
     * 根据角色id获取用户列表
     */
    @GetMapping("/api/user/list/{roleId}")
    public R userListByRoleId(@PathVariable(value = "roleId") Integer roleId,
                              @RequestParam(required = false) Integer current) {

        PageInfo<User> userPageInfo = userService.getUserListByRoleId(roleId, current);

        return R.OK(userPageInfo);
    }

    /**
     * 获取没有拥有角色的用户集合
     */
    @GetMapping("/api/user/notOwnedRole")
    public R notOwnedRole() {

        List<User> userList = userService.getNotOwnedRoleUserList();

        return R.OK(userList);
    }

}

